const express = require('express');
const multer = require('multer');
const xlsx = require('xlsx');
const path = require('path');
const fs = require('fs');

const app = express();
const upload = multer({ dest: 'uploads/' });

// 创建输出目录
if (!fs.existsSync('output')) {
    fs.mkdirSync('output');
}

// 设置静态文件目录
app.use(express.static('public'));
app.use(express.static('output')); // 添加output目录为静态目录
app.use(express.json());

// 处理Excel文件上传
app.post('/upload', upload.single('file'), (req, res) => {
    if (!req.file) {
        return res.status(400).json({ success: false, error: '没有接收到文件' });
    }

    try {
        console.log('读取文件:', req.file.path);
        console.log('文件大小:', fs.statSync(req.file.path).size, 'bytes');
        
        // 设置更多的解析选项
        const options = {
            cellDates: true,  // 将日期解析为JS日期对象
            cellNF: false,    // 不保留数字格式
            cellText: false,  // 不生成格式化文本
            raw: true,        // 获取原始值
            type: 'buffer'    // 使用buffer格式读取
        };

        // 读取文件内容
        const fileContent = fs.readFileSync(req.file.path);
        const workbook = xlsx.read(fileContent, options);
        
        console.log('工作表数量:', workbook.SheetNames.length);
        console.log('所有工作表:', workbook.SheetNames);

        // 存储所有工作表的数据
        const allSheets = {};
        let totalRows = 0;

        // 遍历所有工作表
        for (const sheetName of workbook.SheetNames) {
            console.log(`\n尝试读取工作表: ${sheetName}`);
            const worksheet = workbook.Sheets[sheetName];
            
            if (!worksheet['!ref']) {
                console.log(`工作表 ${sheetName} 没有范围信息，跳过`);
                continue;
            }

            console.log(`工作表 ${sheetName} 范围:`, worksheet['!ref']);
            
            try {
                const sheetData = xlsx.utils.sheet_to_json(worksheet, {
                    raw: true,
                    defval: '',
                    blankrows: false
                });

                console.log(`工作表 ${sheetName} 数据行数:`, sheetData.length);
                if (sheetData.length > 0) {
                    console.log(`工作表 ${sheetName} 第一行数据:`, sheetData[0]);
                    allSheets[sheetName] = {
                        data: sheetData,
                        rowCount: sheetData.length,
                        headers: Object.keys(sheetData[0]),
                        range: worksheet['!ref']
                    };
                    totalRows += sheetData.length;
                }
            } catch (e) {
                console.log(`工作表 ${sheetName} 解析失败:`, e.message);
                allSheets[sheetName] = {
                    error: e.message
                };
            }
        }

        // 检查是否找到任何数据
        if (Object.keys(allSheets).length === 0) {
            return res.status(400).json({ 
                success: false, 
                error: '所有工作表都为空',
                debug: {
                    sheetNames: workbook.SheetNames,
                    sheetsCount: workbook.SheetNames.length
                }
            });
        }

        // 生成JSON文件
        const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
        const jsonFileName = `excel-data-${timestamp}.json`;
        const jsonFilePath = path.join('output', jsonFileName);
        
        // 将数据写入JSON文件
        fs.writeFileSync(jsonFilePath, JSON.stringify(allSheets, null, 2));

        // 清理上传的文件
        fs.unlinkSync(req.file.path);

        res.json({ 
            success: true, 
            data: allSheets,
            downloadUrl: `/${jsonFileName}`,
            debug: {
                totalSheets: workbook.SheetNames.length,
                processedSheets: Object.keys(allSheets).length,
                totalRows: totalRows
            }
        });
    } catch (error) {
        console.error('解析错误:', error);
        res.status(500).json({ 
            success: false, 
            error: error.message,
            stack: error.stack
        });

        // 确保清理上传的文件
        if (req.file && req.file.path) {
            try {
                fs.unlinkSync(req.file.path);
            } catch (e) {
                console.error('清理文件失败:', e);
            }
        }
    }
});

// 启动服务器
const PORT = process.env.PORT || 3001;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
}); 